<?php
if( !defined('CORE') ) exit('Request Error!');
/**
 * @author yangzhi
 * 上传文件管理
 */

class ctl_upload
{
    //定义允许上传的图片扩展名
    public $img_ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp');
    //定义允许上传的文件扩展名
    public $file_ext_arr = array('mp4');

    function __construct()
    {
    }

    /**
     * 上传图片到uploads/img/tmp目录
     * 后面表单提交后记得将图片移动到对应日期的目录中去
     * 移动方法mod_upload::move_img($img_name);
     */
    public function upload_img()
    {
        $img_id = req::item("img_id", 'imgFile', 'text');

        if (req::is_upload_file($img_id))
        {
            $file_path = PATH_UPLOADS . '/img/tmp/';
            $file_tmp_url = config('URL_IMG') . "/tmp";

            util::path_exists($file_path);
            //最大文件大小
            //$max_size = 2097152; //2M
            $ext = req::get_shortname($img_id);
            if(!in_array($ext, $this->img_ext_arr))
            {
                $this->alert("文件格式错误");
            }
            $filename = uniqid() . "." . $ext;
            if (!req::move_upload_file($img_id, $file_path.$filename))
            {
                $this->alert("上传失败");
            }
            $file_real_url = dirname($file_tmp_url) . '/' . date('Ymd') . '/' . $filename;/* 真实路径 */
            $file_tmp_url .= "/" . $filename;/* 临时显示路径 */
            var_dump($file_real_url);
            var_dump($file_tmp_url);

            header('Content-type: text/html; charset=UTF-8');
            echo json_encode(array('error' => 0, 'url' => $file_tmp_url, 'filename' => $file_real_url));
        }
        exit(json_encode(array('error' => 0, 'url' => 'no_upload_file.png', 'filename' => 'no_upload_file.png')));
    }

    /**
     * 编辑器使用，上传图片到uploads/img/目录
     */
    public function upload_editor()
    {
        $img_id = req::item("img_id", 'imgFile', 'text');

        if (req::is_upload_file($img_id))
        {
            $file_path = PATH_UPLOADS . '/img/' . date('Ymd') . '/';

            util::path_exists($file_path);
            //最大文件大小
            //$max_size = 2097152; //2M
            $ext = req::get_shortname($img_id);
            if(!in_array($ext, $this->img_ext_arr))
            {
                $this->alert("文件格式错误");
            }
            $filename = uniqid() . "." . $ext;
            if (!req::move_upload_file($img_id, $file_path.$filename))
            {
                $this->alert("上传失败");
            }

            $file_real_url = config('URL_IMG') . '/' . date('Ymd') . '/' . $filename;/* 真实路径 */

            header('Content-type: text/html; charset=UTF-8');
            echo json_encode(array('error' => 0, 'url' => $file_real_url));
        }
        exit;
    }

    /**
     * 上传文件到uploads/file/tmp目录
     * 后面表单提交后记得将文件移动到对应日期的目录中去
     * 移动方法mod_upload::move_file($file_name);
     */
    public function upload_file()
    {
        $file_id = req::item("file_id", '', 'text');

        if (req::is_upload_file($file_id))
        {
            $file_path = PATH_UPLOADS . '/file/tmp/';
            $file_tmp_url = config('URL_FILE') . "/tmp";

            util::path_exists($file_path);
            //最大文件大小
            //$max_size = 2097152; //2M
            $ext = req::get_shortname($file_id);
            if(!in_array($ext, $this->file_ext_arr))
            {
                $this->alert("文件格式错误");
            }
            $filename = uniqid() . "." . $ext;
            if (!req::move_upload_file($file_id, $file_path.$filename))
            {
                $this->alert("上传失败");
            }
            $file_real_url = dirname($file_tmp_url) . '/' . date('Ymd') . '/' . $filename;/* 真实路径 */
            $file_tmp_url .= "/" . $filename;/* 临时显示路径 */

            header('Content-type: text/html; charset=UTF-8');
            echo json_encode(array('error' => 0, 'url' => $file_tmp_url, 'filename' => $file_real_url));
        }
        exit;
    }

    public function upload_editor_manager()
    {
        //根目录路径，可以指定绝对路径，比如 /var/www/attached/
        $root_path = PATH_UPLOADS . '/img/';
        $root_url = config('URL_IMG') . '/';

        //图片扩展名
        $ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp');

        //根据path参数，设置各路径和URL
        $path = req::get('path', '', 'text');
        if (empty($path )) {
            $current_path = realpath($root_path) . '/';
            $current_url = $root_url;
            $current_dir_path = '';
            $moveup_dir_path = '';
        } else {
            $current_path = realpath($root_path) . '/' . $path;
            $current_url = $root_url . $path . '/';
            $current_dir_path = $path == '.' ? '' : $path;
            $moveup_dir_path = empty($path) ? '' : dirname($current_dir_path);
        }

        //排序形式，name or size or type
        $order_tmp = req::get('order', '', 'text');
        $order = empty($order_tmp ) ? 'name' : strtolower($order_tmp);

        //不允许使用..移动到上一级目录
        if (preg_match('/\.\./', $current_path)) {
            $this->alert('Access is not allowed.');
        }
        //最后一个字符不是/
        if (!preg_match('/\/$/', $current_path)) {
            $this->alert('Parameter is not valid.');
        }
        //目录不存在或不是目录
        if (!file_exists($current_path) || !is_dir($current_path)) {
            $this->alert('Directory does not exist.');
        }

        //遍历目录取得文件信息
        $file_list = array();
        if ($handle = opendir($current_path)) {
            $i = 0;
            while (false !== ($filename = readdir($handle))) {
                if ($filename{0} == '.' || $filename == 'tmp') continue;
                $file = $current_path . $filename;
                if (is_dir($file)) {
                    $file_list[$i]['is_dir'] = true; //是否文件夹
                    $file_list[$i]['has_file'] = (count(glob($file . '/*')) > 0); //文件夹是否包含文件
                    $file_list[$i]['filesize'] = 0; //文件大小
                    $file_list[$i]['is_photo'] = false; //是否图片
                    $file_list[$i]['filetype'] = ''; //文件类别，用扩展名判断
                } else {
                    $file_list[$i]['is_dir'] = false;
                    $file_list[$i]['has_file'] = false;
                    $file_list[$i]['filesize'] = filesize($file);
                    $file_list[$i]['dir_path'] = '';
                    $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
                    $file_list[$i]['is_photo'] = in_array($file_ext, $ext_arr);
                    $file_list[$i]['filetype'] = $file_ext;
                }
                $file_list[$i]['filename'] = $filename; //文件名，包含扩展名
                $file_list[$i]['datetime'] = date('Y-m-d H:i:s', filemtime($file)); //文件最后修改时间
                $i++;
            }
            closedir($handle);
        }

        //排序
        usort($file_list, function($a, $b) use ($order){
            if ($a['is_dir'] && !$b['is_dir']) {
                return -1;
            } else if (!$a['is_dir'] && $b['is_dir']) {
                return 1;
            } else {
                if ($order == 'size') {
                    if ($a['filesize'] > $b['filesize']) {
                        return 1;
                    } else if ($a['filesize'] < $b['filesize']) {
                        return -1;
                    } else {
                        return 0;
                    }
                } else if ($order == 'type') {
                    return strcmp($a['filetype'], $b['filetype']);
                } else {
                    return strcmp($a['filename'], $b['filename']);
                }
            }
        });

        $result = array();
        //相对于根目录的上一级目录
        $result['moveup_dir_path'] = $moveup_dir_path;
        //相对于根目录的当前目录
        $result['current_dir_path'] = $current_dir_path;
        //当前目录的URL
        $result['current_url'] = $current_url;
        //文件数
        $result['total_count'] = count($file_list);
        //文件列表数组
        $result['file_list'] = $file_list;
        header('Content-type: application/json; charset=UTF-8');
        echo json_encode($result);
    }

    /**
     * 输出错误
     */
    public function alert($msg) {
        header('Content-type: text/html; charset=UTF-8');
        echo json_encode(array('error' => 1, 'msg' => $msg));
        exit;
    }

}
